gdkglcontext: Track whether to use GL_TEXTURE_2D or GL_TEXTURE_RECTANGL_ARB
authorAlexander Larsson <alexl@redhat.com>
Mon, 27 Oct 2014 20:12:40 +0000 (21:12 +0100)
committerAlexander Larsson <alexl@redhat.com>
Mon, 27 Oct 2014 20:17:08 +0000 (21:17 +0100)
gdk/gdkdisplayprivate.h
gdk/gdkglcontext.c
gdk/gdkglcontextprivate.h

index 0cd45f856f78b6db0fedc344fba1488279a39acd..6bd87d149c30bfe1c0f6d0d3a47106929d26b3c4 100644 (file)
@@ -116,6 +116,9 @@ struct _GdkDisplay
 
   guint double_click_time;  /* Maximum time between clicks in msecs */
   guint double_click_distance;   /* Maximum distance between clicks in pixels */
+
+  guint has_gl_extension_texture_non_power_of_two : 1;
+  guint has_gl_extension_texture_rectangle : 1;
 };
 
 struct _GdkDisplayClass
index 1bfb17f7e78fb025db4d7862b25ec3de6a3179b5..f1e87406e31d4ed4656816f168f4cec9037be4f4 100644 (file)
 
 #include "gdkintl.h"
 
+#include <epoxy/gl.h>
+
 typedef struct {
   GdkWindow *window;
   GdkVisual *visual;
+
+  guint realized : 1;
+  guint use_texture_rectangle : 1;
+
 } GdkGLContextPrivate;
 
 enum {
@@ -265,6 +271,33 @@ gdk_gl_context_end_frame (GdkGLContext   *context,
   GDK_GL_CONTEXT_GET_CLASS (context)->end_frame (context, painted, damage);
 }
 
+gboolean
+gdk_gl_context_use_texture_rectangle (GdkGLContext *context)
+{
+  GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
+
+  return priv->use_texture_rectangle;
+}
+
+static void
+gdk_gl_context_realize (GdkGLContext *context)
+{
+  GdkGLContextPrivate *priv = gdk_gl_context_get_instance_private (context);
+  gboolean has_npot, has_texture_rectangle;
+
+  has_npot = epoxy_has_gl_extension ("GL_ARB_texture_non_power_of_two");
+  has_texture_rectangle = epoxy_has_gl_extension ("GL_ARB_texture_rectangle");
+
+  if (has_npot)
+    priv->use_texture_rectangle = FALSE;
+  else if (has_texture_rectangle)
+    priv->use_texture_rectangle = TRUE;
+  else
+    g_warning ("Gl implementation doesn't support any form of non-power-of-two textures");
+
+  priv->realized = TRUE;
+}
+
 /**
  * gdk_gl_context_make_current:
  * @context: a #GdkGLContext
@@ -281,6 +314,9 @@ gdk_gl_context_make_current (GdkGLContext *context)
   g_return_if_fail (GDK_IS_GL_CONTEXT (context));
 
   gdk_display_make_gl_context_current (gdk_window_get_display (priv->window), context);
+
+  if (!priv->realized)
+    gdk_gl_context_realize (context);
 }
 
 /**
index 96d49246135a20e5fefae8750f895231ae6846cb..c7b6937ba608cc86fad1bf27670a1df65e2df5bd 100644 (file)
@@ -49,6 +49,7 @@ struct _GdkGLContextClass
                                      cairo_region_t  *region);
 };
 
+gboolean gdk_gl_context_use_texture_rectangle (GdkGLContext *context);
 void            gdk_gl_context_end_frame (GdkGLContext *context,
                                           cairo_region_t *painted,
                                           cairo_region_t *damage);